package python.listview;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

public class JazzyListView extends ListView {

	private final JazzyHelper mHelper;

	public JazzyListView(Context context) {
		super(context);
		mHelper = init(context, null);
	}

	public JazzyListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mHelper = init(context, attrs);
	}

	public JazzyListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mHelper = init(context, attrs);
	}

	private JazzyHelper init(Context context, AttributeSet attrs) {
		JazzyHelper helper = new JazzyHelper(context, attrs);
		super.setOnScrollListener(helper);
		return helper;
	}

	@Override
	public final void setOnScrollListener(OnScrollListener l) {
		mHelper.setOnScrollListener(l);
	}

	/**
	 * Sets the desired transition effect.
	 * 
	 * @param transitionEffect
	 *            Numeric constant representing a bundled transition effect.
	 */
	public void setTransitionEffect(int transitionEffect) {
		mHelper.setTransitionEffect(transitionEffect);
	}

	/**
	 * Sets the desired transition effect.
	 * 
	 * @param transitionEffect
	 *            The non-bundled transition provided by the client.
	 */
	public void setTransitionEffect(JazzyEffect transitionEffect) {
		mHelper.setTransitionEffect(transitionEffect);
	}

	/**
	 * Sets whether new items or all items should be animated when they become
	 * visible.
	 * 
	 * @param onlyAnimateNew
	 *            True if only new items should be animated; false otherwise.
	 */
	public void setShouldOnlyAnimateNewItems(boolean onlyAnimateNew) {
		mHelper.setShouldOnlyAnimateNewItems(onlyAnimateNew);
	}

	/**
	 * If true animation will only occur when scrolling without the users finger
	 * on the screen.
	 * 
	 * @param onlyFlingEvents
	 */
	public void setShouldOnlyAnimateFling(boolean onlyFling) {
		mHelper.setShouldOnlyAnimateFling(onlyFling);
	}

	/**
	 * Stop animations after the list has reached a certain velocity. When the
	 * list slows down it will start animating again. This gives a performance
	 * boost as well as preventing the list from animating under the users
	 * finger if they suddenly stop it.
	 * 
	 * @param itemsPerSecond
	 *            , set to JazzyHelper.MAX_VELOCITY_OFF to turn off max
	 *            velocity. While 13 is a good default, it is dependent on the
	 *            size of your items.
	 */
	public void setMaxAnimationVelocity(int itemsPerSecond) {
		mHelper.setMaxAnimationVelocity(itemsPerSecond);
	}

	/**
	 * Enable this if you are using a list with items that should act like grid
	 * items.
	 * 
	 * @param simulateGridWithList
	 */
	public void setSimulateGridWithList(boolean simulateGridWithList) {
		mHelper.setSimulateGridWithList(simulateGridWithList);
		setClipChildren(!simulateGridWithList);
	}

}
